#ifndef _MTQ_DEBUG_H_
#define _MTQ_DEBUG_H_

#include <limits.h>

#ifndef PATH_MAX
#define PATH_MAX 1024
#endif

#define FILE_SIZE_MAX (6 * 1024 * 1024L)

#define DEBUG_LEN 1024

enum
{
    IMQ_ERROR = 0,
    IMQ_WARN,
    IMQ_INFO,
    IMQ_DEBUG
};

extern int igDebugLevel;

/* macro */
#define IMQDDEBUG(...) (igDebugLevel>=IMQ_DEBUG && _mtqDebug(IMQ_DEBUG, __FILE__, __func__, __LINE__, __VA_ARGS__))
#define IMQIDEBUG(...) (igDebugLevel>=IMQ_INFO  && _mtqDebug(IMQ_INFO,  __FILE__, __func__, __LINE__, __VA_ARGS__))
#define IMQWDEBUG(...) (igDebugLevel>=IMQ_WARN  && _mtqDebug(IMQ_WARN,  __FILE__, __func__, __LINE__, __VA_ARGS__))
#define IMQEDEBUG(...) (igDebugLevel>=IMQ_ERROR && _mtqDebug(IMQ_ERROR, __FILE__, __func__, __LINE__, __VA_ARGS__))

#define IMQVDEBUG(_level_, ...) (igDebugLevel<=(_level_) && _mtqDebug(_level_, __FILE__, __func__, __LINE__, __VA_ARGS__))

#define IMQDDEBUGHEX(...) (igDebugLevel>=IMQ_DEBUG && _mtqDebugHex(IMQ_DEBUG, __VA_ARGS__))
#define IMQIDEBUGHEX(...) (igDebugLevel>=IMQ_INFO  && _mtqDebugHex(IMQ_INFO,  __VA_ARGS__))
#define IMQWDEBUGHEX(...) (igDebugLevel>=IMQ_WARN  && _mtqDebugHex(IMQ_WARN,  __VA_ARGS__))
#define IMQEDEBUGHEX(...) (igDebugLevel>=IMQ_ERROR && _mtqDebugHex(IMQ_ERROR, __VA_ARGS__))

/**
 * set debug level @iDebugLevel
 */
int _mtqSetDebugLevel(int iDebugLevel);

/**
 * get debug level
 */
int _mtqGetDebugLevel(void);

/**
 * debug message
 */
int _mtqDebug(int iLevel, const char *aFile, const char *aFunc, int iLineNo, const char *aFmt, ...);

/**
 * debug hex data
 */
int _mtqDebugHex(int iLevel, const char *aBuf, int iBufLen);

#endif
